package repertorioInstrucciones;

import comun.Natural;

import maquina.Dato;
import maquina.PilaTrabajo;

public class Suma extends Instruccion {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	public Suma(){
		super();
	}
	@Override
	public PilaTrabajo accion(PilaTrabajo pilaT) {
		Dato a =  (Dato) pilaT.getPila().pop();
		Dato b =  (Dato) pilaT.getPila().pop(); 


		if(a.getDato() instanceof Float){
			float n1 = (Float) a.getDato();
			float res=0;
			Dato d;
			if ( b.getDato() instanceof Float){
				float n2 = ((Float) b.getDato());
				res = n2 + n1;
			}
			else
				if ( b.getDato() instanceof Integer){
					int n2 = ((Integer) b.getDato());
					res = n2 + n1;
				}
				else 
					if (b.getDato() instanceof Natural){
						int n2 = ((Natural)b.getDato()).getValor();
						res = n2 + n1;
					}					
			d = new Dato<Float>(res);
			pilaT.getPila().push(d);
		}
		else
			if(b.getDato() instanceof Float){
				float n2 = (Float) b.getDato();
				float res=0;
				Dato d;
				if ( a.getDato() instanceof Integer){   
					int n1 = ((Integer) a.getDato());
					res = n2+n1;
				}
				else
					if (a.getDato()instanceof Natural){
						int n1 = ((Natural)a.getDato()).getValor();
						res = n2 + n1;
					}
				d = new Dato<Float>(res);
				pilaT.getPila().push(d);
			}
			else
				if(a.getDato() instanceof Integer ){
					int n1 = ((Integer) a.getDato());
					int res;
					Dato d;
					int n2;
					if (b.getDato() instanceof Natural)n2 = ((Natural)b.getDato()).getValor();
					else n2 = ((Integer)b.getDato());
					res = n2+n1;
					d = new Dato<Integer>(res);
					pilaT.getPila().push(d);
				}
				else
					if(b.getDato() instanceof Integer){
						int n1 = ((Natural)a.getDato()).getValor();
						//int n2 = ((Integer)a.getDato());
						int n2 = ((Integer)b.getDato());
						int res = n2+n1;
						Dato<Integer> d = new Dato<Integer>(res);
						pilaT.getPila().push(d);
					}
					else{ // los dos naturales
						int n1 = ((Natural)a.getDato()).getValor();
						int n2 = ((Natural)b.getDato()).getValor();
						int res = n2+n1;
						Dato<Natural> d = new Dato<Natural>(new Natural(res));
						pilaT.getPila().push(d);
					}
		return pilaT;
	}

}
